home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / umich / utils / tosfixes / hsmoda04.lzh / SETTER.C < prev    next >
C/C++ Source or Header  |  1994-05-07  |  7KB  |  262 lines

  1. #include <stdio.h>
  2.  
  3. /* geschrieben für&mit Sozobon C auf ATARI-ST */
  4. /* Zum Einstellen von Parametern in PRG/GTP/TOS/TTP Files, */
  5. /* die nach Harun Scheutzow Definition aufgebaut sind */
  6.  
  7. /* für Sozobon */
  8. /* 8Bit */
  9. #define BYTE char
  10. #define UBYTE unsigned char
  11. /* 16Bit */
  12. #define WORD short
  13. /* 32Bit */
  14. #define LONG long int
  15. #define ULONG unsigned long int
  16.  
  17.  
  18. /* Maximallänge des Files */
  19. #define MAXINPLEN 32000
  20.  
  21. /* ungültig-Markierung in LONG-Tabellen */
  22. #define UNUSEDL 0x80000000L
  23.  
  24.  
  25. static BYTE usinpuff[128]; /* allgemeiner Puffer für Usereingaben */
  26.  
  27.  
  28. WORD ask_for_yes(void)
  29. {
  30.  int a, ok;
  31.  ok = 0;
  32.  while (0 == ok)
  33.  {
  34.   scanf("%126s", usinpuff);
  35.   a = (int)usinpuff[0];
  36.   if ((a == 'j') || (a == 'J') || (a == 'y') || (a == 'Y'))
  37.   {
  38.    a = -1; ok = 1;
  39.   }
  40.   else
  41.   {
  42.    if ((a == 'n') || (a == 'N'))
  43.    {
  44.     a = 0; ok = 1;
  45.    }
  46.   }
  47.  }
  48.  return (WORD)a;
  49. }
  50.  
  51.  
  52.  
  53.  
  54. main(argc, argv)
  55. int argc;
  56. char *argv[ ];
  57. {
  58.  LONG *lptr;
  59.  static BYTE inpbuf[MAXINPLEN];
  60.  BYTE  *magisch;
  61.  BYTE  *xptr, *sptr, *eptr;
  62.  BYTE  c;
  63.  UBYTE cfg_lbyte, cfg_hbyte;
  64.  LONG  magptr;
  65.  FILE *inpfp;
  66.  int f, i, stop_it, inplen;
  67.  
  68.  struct {
  69.   WORD branch; /* immer 0x601a */
  70.   ULONG tlen; /* Länge des TEXT */
  71.   ULONG dlen; /* Länge des DATA */
  72.   ULONG blen;
  73.   ULONG slen;
  74.   ULONG res1;
  75.   ULONG prgflags;
  76.   WORD absflag;
  77.  } p_head;
  78.  
  79.  magisch = "hAruNs cONfigER";
  80.  
  81.  printf("Konfigurator für PRG/GTP/TOS/TTP nach Haruns Methode für\n");
  82.  printf("fremdkonfigurierte Programme. / Setter for programs.\n");
  83.  printf("(C) Harun_Scheutzow@B.maus.de, 1994-05-07\n");
  84.  if (2 == argc)
  85.  {
  86.   if (0 != (inpfp = fopen(argv[1],"rb+"))) /* einfaches = ist hier ok, File lesen & schreiben */
  87.   {
  88.    if (1 == fread(&p_head, sizeof(p_head), 1, inpfp)) /* lies Programmkopf */
  89.    {
  90.     inplen = fread(inpbuf, 1, MAXINPLEN, inpfp); /* lies gesamtes Programm */
  91.     if ((inplen > 0) && (inplen < MAXINPLEN) && (p_head.tlen + p_head.dlen <= (ULONG)inplen))
  92.     {
  93.      /* suche nach dem magischen String in TEXT und DATA */
  94.      sptr = inpbuf;
  95.      eptr = sptr;
  96.      eptr += (p_head.tlen + p_head.dlen);
  97.      f = 0;
  98.      while ( eptr - sptr > 16 && 16 > f)
  99.      {
  100.       if( magisch[f++] != *sptr++ )
  101.       {
  102.        sptr -= f; /* zurück auf Vergleichbeginn */
  103.        f = 0;
  104.        sptr += 2; /*auf nächstes WORD */
  105.       }
  106.       if( f == 16 )
  107.       {
  108.           magptr = *(LONG *)sptr;
  109.        if( sptr - inpbuf - 16 != magptr )
  110.        {
  111.         /* Magischer String stimmte, Zeiger aber nicht, also erstes WORD */
  112.         /* des Strings überspringen und weitersuchen */
  113.            sptr -= 14; 
  114.            f = 0;
  115.        }
  116.       }
  117.      }
  118.      if (16 == f)
  119.      {
  120.       /* magischer String da, Zeiger auch ok */
  121.       sptr += 4;
  122.       printf("\nBearbeite Programm / Work on program:\n");
  123.       printf("%s\n", argv[1]);
  124.       stop_it = 0;
  125.       while ( *sptr && !stop_it)
  126.       {
  127.        /* Auswerteschleife */
  128.        /* drucke den String aus */
  129.        printf("\n Informationstext / information text :\n%s",(char *)sptr);
  130.        while (0 != *sptr++); 
  131.        if ((LONG)sptr & 1)  sptr++;
  132.        cfg_hbyte = *sptr++;
  133.        cfg_lbyte = *sptr++;
  134.        switch(cfg_hbyte)
  135.        {
  136.        case 0:
  137.         /* Ja/Nein Entscheidung */
  138.         printf(" Aktuelle Einstellung / current setting : ");
  139.         if (*((WORD *)sptr))
  140.         {
  141.          printf("Ja. / Yes.\n");
  142.         }
  143.         else
  144.         {
  145.          printf("Nein. / No.\n");
  146.         }
  147.         printf("  Eingeben: _J_a oder _N_ein. / enter: _Y_es or _N_o.\n");
  148.         *(WORD *)sptr = ask_for_yes();
  149.         sptr += 2; /* Zeiger weiter setzen */
  150.         break;
  151.        case 1:
  152.         /* LONG-Werteliste eingeben */
  153.         f = (int)cfg_lbyte;
  154.         if (f)
  155.         {
  156.          printf(" Aktuelle Einstellungen / current settings :\n");
  157.          lptr = (LONG *)sptr;
  158.          i = 1;
  159.          while (f--)
  160.          {
  161.           printf("Platz / place Nr.%d : ",i++);
  162.           if (UNUSEDL == *lptr)
  163.           {
  164.            printf("ungültig / invalid\n");
  165.            lptr++;
  166.           }
  167.           else
  168.           {
  169.            printf("%16ld\n",*lptr++);
  170.           }
  171.          }
  172.          printf("\n Neue Werte eingeben, Platz ungültig markieren durch Eingabe von u.\n");
  173.          printf(" / Enter new values. Mark place invalid by input of u.\n");
  174.          lptr = (LONG *)sptr;
  175.          f = (int)cfg_lbyte;
  176.          i = 1;
  177.          while (f)
  178.          {
  179.           printf("Platz / place Nr.%d : ",i);
  180.           scanf("%60s",usinpuff);
  181.           if ((char)0 == usinpuff[0] || 'U' == usinpuff[0] || 'u' == usinpuff[0])
  182.           {
  183.            /* U-Eingabe, den Platz ungültig markieren */
  184.            i++; f--;
  185.            *lptr++ = UNUSEDL;
  186.           }
  187.           else
  188.           {
  189.            if (1 == sscanf(usinpuff, "%li", lptr))
  190.            {
  191.             i++; f--; lptr++;
  192.            }
  193.            else printf("Falsche Eingabe, wiederholen! / Wrong input, again!\n");
  194.           }
  195.          }
  196.          sptr = (BYTE *)lptr;
  197.         }
  198.         else 
  199.         {
  200.          printf("**** File damaged: 0 longs in list.\n");
  201.          stop_it = 1;
  202.         }
  203.         break;
  204.        case 2:
  205.         /* String eingeben */
  206.         if ((cfg_lbyte & 1) || (cfg_lbyte < 2))
  207.         {
  208.          printf("**** File damaged: odd or below 2 string place len.\n");
  209.          stop_it = 1;
  210.         }
  211.         else
  212.         {
  213.          printf(" Aktuelle Einstellung / current setting:\n");
  214.          printf("%s\n",(char *)sptr);
  215.          printf("  Neue Eingabe, max. %d Zeichen / New input, max. %d characters\n", (int)cfg_lbyte - 1, (int)cfg_lbyte - 1);
  216.          scanf("%126s", usinpuff);
  217.          xptr = usinpuff;
  218.          eptr = sptr;
  219.          f = (int)cfg_lbyte;
  220.          c = 1;       /* != für Anfang */
  221.          while (f-- > 1) /* letztes Byte wird hier nicht behandelt */
  222.           c = *eptr++ = c ? *xptr++ : (BYTE)0; /* ist seltsam, aber OK */
  223.          *eptr = (BYTE)0; /* immer ein Nullbyte am Ende */
  224.          sptr += (int)cfg_lbyte;
  225.         }
  226.         break;
  227.        default:
  228.         printf("**** Unknown command. File damaged or use newer SETTER.\n Aborted!\n");
  229.         stop_it = 1;
  230.        }
  231.       }
  232.       printf("\nKonfiguration beendet. / Configuration completed.\n");
  233.       printf("Änderungen speichern / Save changes _J_a/_N_ein/_Y_es/_N_o?\n");
  234.       if (ask_for_yes())
  235.       {
  236.        fseek(inpfp,(LONG)sizeof(p_head),SEEK_SET); /* nur Prgheader nicht zurückschreiben */
  237.        if (inplen == fwrite(inpbuf, 1, inplen, inpfp))
  238.        {
  239.         printf("Konfiguration erfolgreich. / Configuration successful.\n");
  240.        }
  241.        else printf("**** Error during saving the file.\n");
  242.       }
  243.       else printf("Einstellungen NICHT gespeichert. / Settings NOT saved.\n");
  244.      }
  245.      else printf("**** The file does not contain configuration.\n");
  246.     }
  247.     else printf("**** Read Error OR File too long OR not a program\n");
  248.    }
  249.    else printf("**** File too short\n");
  250.    fclose(inpfp);
  251.   }
  252.   else printf("**** Error opening file\n");
  253.  }
  254.  else
  255.  {
  256.   printf("**** Wrong number of parameters!\n");
  257.   printf(" Nutzung / usage :\n");
  258.   printf("setter Filename_des_zu_konfigurierenden_Programms\n");
  259.  }
  260.  return 0;
  261. }
  262.